構想: tailした内容をjqに渡したい
tail -f file | jq '.'でいけるかと思ったが、ただパイプで繋げるだけではダメだった
while readで1行読み込み、それをパイプでjqに繋げるとうまくいくみたい
そのままだとバックスラッシュが含まれているデータがエスケープされてしまうため、read -rオプションを使う
read --help
(略)
-r do not allow backslashes to escape any characters
こうなる
想定した書き方
code:bash
tail -f file | jq '.'
これだとやりたいことができた
code:bash
tail -f -q ${file} | while read -r line; do
echo "$line" | jq -r '.'
done
何がわかってないから最初に期待する挙動を書けなかったんだろう?
tail -fの挙動?
パイプの仕組み?
パイプから入力を受け取ったjqの挙動?
どこをどう切り分けて動かしてみると「わかる」に近づけるのかわからん…
複数ファイルをtailするとファイル名が出力されてしまう(jqの処理対象外の行)ので、複数指定する場合はtail -qオプションをつけておく
code:bash
tail -n 1 filename_*
==> filename_1 <==
{"Timestamp": "2023-..."}
==> filename_2 <==
{"Timestamp": "2023-..."}
==> filename_3 <==
{"Timestamp": "2023-..."}
code:bash
tail -n 1 -q filename_*
{"Timestamp": "2023-..."}
{"Timestamp": "2023-..."}
{"Timestamp": "2023-..."}
whileでループさせるからファイル名だけ弾く分岐処理を書く方法もあるが、-qの方が楽かな
参考